
//*************** 基本概念  *****************/

function* helloWorldGenerator() {
    console.log('开始执行了')
    var rs1 = yield 'hello';
    console.log(rs1)
    var rs2 = yield 'world';
    console.log(rs2)
    return 'ending';
}

var hw = helloWorldGenerator();
console.log(hw.next())                      //* 第一次调用，Generator 函数开始执行，直到遇到第一个yield表达式为止
console.log(hw.next('rs1 的参数哦'))         //* 第二次调用，Generator 函数从上次yield表达式停下的地方
console.log(hw.next())



//*************** 手写一个co迭代器函数  *****************/

function co(generator, call) {
    let iterator = generator.next()
    while (!iterator.done) { iterator = generator.next() }
    call(iterator.value)
}

co(hw, (val) => {
    console.log('执行我了啊')
    console.log(val)
})

//*************** for...of 循环  *****************/

function* foo() {
    yield 1;
    yield 2;
    yield 3;
    yield 4;
    yield 5;
    return 6;
}

for (let v of foo()) {
    console.log(v);
}
// 1 2 3 4 5

//***************  Generator.prototype.throw  *****************/

var g = function* () {
    try {
        yield;
    } catch (e) {
        console.log('内部捕获', e);
    }
};

var i = g();
i.next();

try {
    i.throw('a');
    i.throw('b');
} catch (e) {
    console.log('外部捕获', e);
}
// 内部捕获 a
// 外部捕获 b


//***************  Generator.prototype.return  *****************/

// *Generator 函数返回的遍历器对象，还有一个return()方法，可以返回给定的值，并且终结遍历 Generator 函数。

function* gen() {
    yield 1;
    yield 2;
    yield 3;
}

var g = gen();

g.next()        // { value: 1, done: false }
g.return('foo') // { value: "foo", done: true }
g.next()        // { value: undefined, done: true }



//***************  yield*  *****************/
function* foo() {
    yield 'a';
    yield 'b';
}

// function* bar() {            //手动遍历
//     yield 'x';
//     // 手动遍历 foo()
//     for (let i of foo()) {
//         console.log(i);
//     }
//     yield 'y';
// }

function* bar() {
    yield 'x';
    yield* foo();
    yield 'y';
}

for (let v of bar()) {
    console.log(v);
}

//***************  异步操作的同步化表达  *****************/

function* loadUI() {
    showLoadingScreen();
    yield loadUIDataAsynchronously();
    hideLoadingScreen();
}
var loader = loadUI();
// 加载UI
loader.next()

// 卸载UI
loader.next()